package com.hspedu.threaduse;

/**
 * @Author Stringzhua
 * @Date 2024/3/14 23:38
 * description:通过Thread 类创建线程
 */
public class Thread01 {
    public static void main(String[] args) throws InterruptedException {
        //创建Cat对象,可以当作线程使用
        Cat cat = new Cat();
        //阅读源码
        /*
        (1)
          public synchronized void start() {
             start0();
          }
        (2)
        //start0() 是本地方法,是JVM调用,底层是c++/c实现
        //真正实现多线程的效果,是start0(),而不是run
        private native void start0();
        (3)
        * */


        cat.start();//启动线程--->最终会执行cat的run方法
//        cat.run();//run方法就是一个普通的方法,并没有真正的启动一个线程,没有真正的启动一个线程,就会把run方法执行完毕,才继续向下执行
        //说明:当main线程启动一个子线程 Thread-0，主线程不会阻塞,会继续执行【串行化执行】
        //这时,主线程和子线程是交替执行的
        System.out.println("主线程继续执行" + Thread.currentThread().getName());//名字main
        for (int i = 0; i < 60; i++) {
            System.out.println("主线程 i=" + i);
            //让主线程休眠
            Thread.sleep(1000);
        }
    }
}

//1.当一个类继承了Thread类,该类就可以当作线程使用
//2.我们会重写run方法,写上自己的业务代码
//3.run Thread 类 实现了Runnable接口的run方法
/*
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
* */
class Cat extends Thread {
    int times = 0;

    @Override
    public void run() {//往往会重写run方法,写上自己的业务逻辑
        while (true) {
            //编写程序,开启一个线程,该线程每隔1秒.在控制台输出"喵喵,我是小猫咪"
            System.out.println("喵喵,我是小猫咪" + (++times) + "线程名称=" + Thread.currentThread().getName());//main
            try {
                //让该线程休眠一秒钟 ctrl+alt+T
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //对上题改进:当输出80次 喵喵,我是小猫咪,结束该线程
            if (times == 80) {
                break;//当times等于80时,退出while循环
            }
            //使用JConsole 监控线程执行情况,并画出程序示意图
        }
    }
}